/**
 * 文件类型判断工具
 */

// 文件类型枚举
export const FileType = {
  IMAGE: 'image',
  PDF: 'pdf',
  DOCX: 'docx',
  EXCEL: 'excel',
  PPT: 'ppt',
  MARKDOWN: 'markdown',
  TEXT: 'text',
  UNSUPPORTED: 'unsupported'
}

// 文件扩展名映射
const extensionMap = {
  // 图片格式
  jpg: FileType.IMAGE,
  jpeg: FileType.IMAGE,
  png: FileType.IMAGE,
  gif: FileType.IMAGE,
  svg: FileType.IMAGE,
  webp: FileType.IMAGE,
  bmp: FileType.IMAGE,
  
  // PDF
  pdf: FileType.PDF,
  
  // Word 文档
  docx: FileType.DOCX,
  doc: FileType.DOCX,
  
  // Excel 表格
  xlsx: FileType.EXCEL,
  xls: FileType.EXCEL,
  csv: FileType.EXCEL,
  
  // PPT 演示文稿
  pptx: FileType.PPT,
  ppt: FileType.PPT,
  
  // Markdown
  md: FileType.MARKDOWN,
  markdown: FileType.MARKDOWN,
  
  // 纯文本
  txt: FileType.TEXT,
  json: FileType.TEXT,
  xml: FileType.TEXT,
  log: FileType.TEXT,
  js: FileType.TEXT,
  jsx: FileType.TEXT,
  ts: FileType.TEXT,
  tsx: FileType.TEXT,
  css: FileType.TEXT,
  scss: FileType.TEXT,
  less: FileType.TEXT,
  html: FileType.TEXT,
  vue: FileType.TEXT,
  py: FileType.TEXT,
  java: FileType.TEXT,
  c: FileType.TEXT,
  cpp: FileType.TEXT,
  h: FileType.TEXT,
  go: FileType.TEXT,
  rs: FileType.TEXT,
  php: FileType.TEXT,
  rb: FileType.TEXT,
  sh: FileType.TEXT,
  bat: FileType.TEXT,
  yaml: FileType.TEXT,
  yml: FileType.TEXT,
  ini: FileType.TEXT,
  conf: FileType.TEXT,
  cfg: FileType.TEXT
}

/**
 * 根据文件名获取文件类型
 * @param {string} fileName - 文件名
 * @returns {string} 文件类型
 */
export function getFileType(fileName) {
  if (!fileName) return FileType.UNSUPPORTED
  
  const extension = fileName.split('.').pop()?.toLowerCase()
  return extensionMap[extension] || FileType.UNSUPPORTED
}

/**
 * 根据文件类型获取预览组件名称
 * @param {string} fileType - 文件类型
 * @returns {string} 组件名称
 */
export function getPreviewComponent(fileType) {
  const componentMap = {
    [FileType.IMAGE]: 'ImagePreview',
    [FileType.PDF]: 'PdfPreview',
    [FileType.DOCX]: 'DocxPreview',
    [FileType.EXCEL]: 'ExcelPreview',
    [FileType.PPT]: 'PptPreview',
    [FileType.MARKDOWN]: 'MarkdownPreview',
    [FileType.TEXT]: 'TextPreview',
    [FileType.UNSUPPORTED]: null
  }
  
  return componentMap[fileType]
}

/**
 * 检查文件是否支持预览
 * @param {string} fileName - 文件名
 * @returns {boolean}
 */
export function isFileSupported(fileName) {
  const fileType = getFileType(fileName)
  return fileType !== FileType.UNSUPPORTED
}

/**
 * 读取文件内容
 * @param {File} file - 文件对象
 * @param {string} readAs - 读取方式: 'text', 'dataURL', 'arrayBuffer'
 * @returns {Promise} 文件内容
 */
export function readFileContent(file, readAs = 'dataURL') {
  return new Promise((resolve, reject) => {
    const reader = new FileReader()
    
    reader.onload = (e) => resolve(e.target.result)
    reader.onerror = (e) => reject(e)
    
    switch (readAs) {
      case 'text':
        reader.readAsText(file)
        break
      case 'arrayBuffer':
        reader.readAsArrayBuffer(file)
        break
      case 'dataURL':
      default:
        reader.readAsDataURL(file)
        break
    }
  })
}

/**
 * 将代理 URL 转换为相对路径（以便通过 Vite 代理）
 * @param {string} url - 原始 URL
 * @returns {string} 转换后的 URL（相对路径或原 URL）
 */
export function normalizeProxyUrl(url) {
  try {
    const urlObj = new URL(url)
    // 检测是否为代理 URL（如 http://localhost/proxy.php?url=...）
    if (urlObj.pathname.includes('proxy.php')) {
      // 转换为相对路径，让 Vite 代理处理
      const queryString = urlObj.search
      return `/proxy.php${queryString}`
    }
    // 不是代理 URL，返回原 URL
    return url
  } catch (e) {
    // URL 解析失败，返回原 URL
    console.warn('URL 解析失败，使用原始 URL:', e)
    return url
  }
}

